import axios, { AxiosRequestConfig } from 'axios'

const request = axios.create({
  baseURL: 'http://localhost:7001/api/v1', // 基础路径
})

// 控制登录过期的锁
let isRefreshing = false

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 统一设置用户身份 token
    // const user = store.state.dataObj
    // if (user && user.token) {
    //   if (!config?.headers) {
    //     throw new Error(
    //       `Expected 'config' and 'config.headers' not to be undefined`
    //     )
    //   }
    //   config.headers.Authorization = `Bearer ${user.token}`
    // }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    // 统一处理响应错误，例如 token 无效、服务端异常等
    const { status } = response.data

    // 请求成功
    if (!status || status === 200) {
      return response
    }

    // 处理 Token 过期

    // 错误情况：比如 token 无效@.

    // 统一处理登录过期/
    if (status === 401) {
      if (isRefreshing) return Promise.reject(response)
      isRefreshing = true

      console.log('您的登录已过期，您可以取消停留在此页面，或确认重新登录')
      // 在内部消化掉这个业务异常
      return Promise.reject(response)
    }

    // 其它错误给出提示即可，比如 400 参数错误之类的
    console.log(response.data.error || '请求失败，请稍后重试')
    return Promise.reject(response)
  },
  (err) => {
    console.log(err.response.data.error || '请求失败，请稍后重试')
    return Promise.reject(err)
  }
)

// export default request
export default <T = any>(config: AxiosRequestConfig) => {
  return request(config).then((res) => {
    return (res.data.data || res.data) as T
  })
}
